function* gen() {
    const num1 = yield foo(1);
    const num2 = yield foo(num1);
    const num3 = yield foo(num2);
    return num3;
}

function foo(n) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(n * 2);
        }, 1000);
    });
}

function generatorToAsync(generatorFn) {
    return function () {
        return new Promise((resolve, reject) => {
            const g = generatorFn();

            const next1 = g.next();
            next1.value.then((res1) => {
                const next2 = g.next(res1);
                next2.value.then((res2) => {
                    const next3 = g.next(res2);
                    next3.value.then((res3) => {
                        resolve(g.next(res3).value);
                    });
                });
            });
        });
    };
}

const asyncFn = generatorToAsync(gen);
asyncFn().then((res) => console.log("res is:", res));
